EricCarneiro
(usa Ubuntu)
Enviado em 16/03/2011 - 13:45h
Pessoal, já tentei de tudo, mas não consigo encontrar onde estou errando. Seguinte:
Estudando aqui com o Livro Introdução a Estrutura de B.D. tem uma explicação e exemplo de uma lista encadeada(criar, inserir, remover, listar...) contudo ao remover o primeiro elemento da lista, ele não passa o ponteiro como deveria, pois quando mando listar ele imprime o valor 0 para o primeiro elemento depois de removido.
CÓDIGO:
************************************************************
#include <stdio.h>
#include <stdlib.h>
struct lista{
int info;
struct lista* prox;
};
typedef struct lista Lista;
/* função de criação: retorna uma lista vazia */
Lista* lst_cria(void)
{
return NULL;
}
/*inserção no início: retorna a lista atualizada */
Lista* lst_insere(Lista* l, int i)
{
Lista* novo=(Lista*)malloc(sizeof(Lista));
novo->info=i;
novo->prox=l;
return novo;
}
/*função imprime: imprime valores dos elementos */
void lst_imprime(Lista* l)
{
Lista* p; //variável auxiliar para percorrer a lista
for(p=l;p!=NULL;p=p->prox)
printf("info=%d\n",p->info);
printf("\n");
}
/*função vazia: retorna 1 se vazia ou 0 se não vazia */
int lst_vazia(Lista* l)
{
return(l==NULL);
}
/*função busca: busca um elemento na lista */
Lista* lst_busca(Lista* l, int v)
{
Lista* p;
for(p=l;p!=NULL;p=p->prox){
if(p->info==v)
return p;
}
return NULL; //não encontra o elemento: retorna nulo
}
/*função retira: retira o elemento da lista*/
Lista* lst_retira(Lista* l, int v)
{
Lista* ant=NULL; //ponteiro para elemento da lista
Lista* p=l; //ponteiro para percorrer a lista
/*procura um elemento na lista guardando o anterior*/
while(p!=NULL && p->info!=v){
ant=p;
p=p->prox;
}
/*verifica se achou o elemento*/
if(p==NULL)
return l; //não encontrou o elemento, retorna lista original
/*retira o elemento*/
if(ant==NULL){
/*retira o elemento do início*/
l=p->prox;
free(p);
return l;
}
else{
/*retira o elemento do meio da lista*/
ant->prox=p->prox;
}
free(p);
return l;
}
/*função libera: libera lista*/
void lst_libera(Lista* l)
{
Lista* p=l;
while (p!=NULL){
Lista* t = p->prox; //guarda referência para próximo elemento
free(p);
p=t;
}
}
/*função insere ordenado: insere elemento em ordem*/
Lista* lst_insere_ordenado(Lista* l, int v)
{
Lista* novo;
Lista* ant=NULL; //ponteiro para elemento anterior
Lista* p=l; //ponteiro para percorrer lista
/*procura posição de inserção*/
while(p!=NULL && p->info<v){
ant=p;
p=p->prox;
}
/*cria novo elemento*/
novo=(Lista*)malloc(sizeof(Lista));
novo->info=v;
/*encadeia elemento*/
if(ant==NULL){ //insere o elemento no início
novo->prox=l;
l=novo;
}
else{ //insere o elemento no meio da lista
novo->prox=ant->prox;
ant->prox=novo;
}
return l;
}
int main(void)
{
Lista* l; //declara uma lista não inicializada
l=lst_cria(); //cria e inicializa lista como vazia
l=lst_insere(l,23); //insere na lista o elemento 23
l=lst_insere(l,45); //insere na lista o elemento 45
l=lst_insere(l,56); //insere na lista o elemento 10
l=lst_insere(l,78); //insere na lista o elemento 33
lst_imprime(l); //deve imprimir: 78 56 45 23
lst_retira(l,78);
lst_imprime(l); //deve imprimir: 56 45 23
lst_retira(l,23);
lst_imprime(l); //deve imprimir: 56 23
lst_libera(l);
return 0;
}
************************************************************